package com.wkbb.basic.service;

import com.github.pagehelper.PageInfo;
import com.wkbb.basic.model.Family;
import com.wkbb.basic.vo.FamilyManageEditVo;
import com.wkbb.basic.vo.FamilyManagePageListVo;
import com.wkbb.common.base.BaseService;
import com.wkbb.common.dto.ResultDTO;
import com.wkbb.common.dto.basic.FamilyInfoDto;
import com.wkbb.common.dto.im.GroupUserInfoDto;
import com.wkbb.common.dto.im.ImUserNum;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author dengjingyuan
 * @date 2019-07-04 10:32
 */
public interface FamilyService extends BaseService<Family> {

    @Transactional(rollbackFor = Exception.class)
    FamilyInfoDto insertWithFamily(FamilyInfoDto familyInfoDto, String createBy,Boolean flag);

    Long insert(FamilyInfoDto familyInfoDto, String userName) throws Exception;

    void insert(FamilyManageEditVo familyManageEditVo, String userName,Boolean flag) throws Exception;

    FamilyInfoDto insertFamily(FamilyInfoDto familyInfoDto, Long userId, String createBy,Boolean flag);

    void update(FamilyInfoDto familyInfoDto, String userName) throws Exception;

    void updateMobile(FamilyInfoDto familyInfoDto) throws Exception;

    /**
     * 更新家长信息
     *
     * @param familyInfoDto 家长信息
     * @param updateBy      操作人
     * @param isBack        是否后台操作
     * @throws Exception 抛出异常
     */
    void updateFamily(FamilyInfoDto familyInfoDto, String updateBy, boolean isBack) throws Exception;

    /**
     * 修改家长历史卡号手机号
     * @param familyInfoDto 需要修改的家长
     * @throws Exception 异常
     */
    void updateFamilyHistory(FamilyInfoDto familyInfoDto) throws Exception;

    ResultDTO deleteFamily(List<Long> ids, String deleteBy) throws Exception;

    FamilyInfoDto getFamilyInfoById(Long id) throws Exception;

    PageInfo<FamilyInfoDto> getFamilyInfoList(Map<String, Object> params, Integer pageNo, Integer pageSize) throws Exception;

    /**
     * 后台查询家长管理分页列表
     *
     * @param params   参数
     * @param pageNo   页码
     * @param pageSize 每页条数
     * @return 家长分页列表
     */
    PageInfo<FamilyManagePageListVo> getFamilyManageList(Map<String, Object> params, Integer pageNo, Integer pageSize);

    /**
     * 根据班级ID获取家长分页列表
     *
     * @param params   参数（学校ID,班级ID）
     * @param pageNo   页码
     * @param pageSize 每页条数
     * @return 家长分页列表
     * @throws Exception 抛出异常
     */
    PageInfo<FamilyInfoDto> getFamilyInfoPageByClassId(Map<String, Object> params, Integer pageNo, Integer pageSize) throws Exception;

    /**
     * 根据班级ID获取家长列表
     *
     * @param params 参数（学校ID,班级ID）
     * @return 家长列表
     * @throws Exception 抛出异常
     */
    List<FamilyInfoDto> getFamilyInfoListByClassId(Map<String, Object> params) throws Exception;

    /**
     * 获取家长列表（去重）
     *
     * @param orgId 学校ID
     */
    List<Family> getFamilyListUniqueByOrgId(Long orgId);

    /**
     * 通过学生ID查询家长列表
     *
     * @param id 学生ID
     * @return 家长列表
     */
    List<Family> getFamilyListByStudentId(Long id);

    /**
     * 通过学生ID删除其所有家长
     *
     * @param orgId 学校ID
     * @param studentId 学生用户ID
     * @param deleteBy  操作人
     */
    void deleteByStudentId(Long orgId, Long studentId, String deleteBy) throws Exception;

    /**
     * 通过学生ID删除其所有家长
     *
     * @param mobile 家长手机号
     */
    FamilyInfoDto getFamilyInfoByMobile(String mobile)throws Exception;


    /**
     * 根据家长userId查询家长列表
     * @param params
     * @return
     */
    List<FamilyInfoDto> getFamilyListByFamily(Map<String, Object> params);

    List<Map<String, Object>> getFamilyCountStatByOrgId(Long id);

    List<ImUserNum> getFamilyList(Map<String, Object> params);

    List<Family> getFamilyListByUserIds(List<Long> userIds,Long orgId);

    List<Family> getFamilyListByUpdateTime(Long orgId, Date date);

    //导出家长列表
    List<Object[]> exportFamilyExcel(Map<String, Object> params) throws Exception;

    /**
     * 根据学生userId查询家长列表
     * @param params
     * @return
     */
    List<FamilyInfoDto> getFamilyListByStudent(Map<String, Object> params);

    List<Long> getFamilyListAll(Long orgId);

    void getRepairFamilyList(Long orgId);

    List<FamilyInfoDto> getFamilyListByFamilySmartUserId(Map<String, Object> params);

    Map<String,Integer> statFamilyInfo(Long orgId,Long gradeId,Long classId);

    void operateFaceFlag(Long orgId,Long familyUserId,Boolean faceFlag) throws Exception;

    void syncFaceFlag(Long orgId) throws Exception;

    void repairFamilyImTask();

    PageInfo<Family> getFamilyListByPage(HashMap<String, Object> params, Integer pageNo, Integer pageSize);
}
